iT邦幫忙

2

[Day 2]Docker從零學習筆記

  • 分享至 

  • xImage
  •  

Docker 挑戰 - Day 2

目標

  1. Image 跟 Container
  2. Volume & Volume進階挑戰(可不做)
  3. 建立一個自己的Docker network

一、Image 跟 Container

Image = 靜態模板(像 App 安裝檔)
Container = 活動中的實體(像跑起來的 App)

Image

Image 會包含你專案內的檔案,只要被 Dockerfile 中的 COPY 或 ADD 指令打包進去的內容都會存在於 image 中。

不會包含 說明
.env 或 gitignored 文件 除非你有 COPY 它進 image
volume 掛載的資料 像 MySQL 的資料,如果掛在 volume,只會存在 volume,不會進 image 裡
運行中動態產生的檔案 不會寫進 image,這是容器層級的變化
指令 功能
docker images 查看本機有哪些Images
docker run -d -p 8080:80 nginx 用 nginx Image 快速建立一個 Container
docker ps 查看現在運行的 Containers
docker stop <容器ID或名字> 停止容器
docker rm <容器ID或名字> 刪除容器

docker images
docker run -d -p 8080:80 nginx
docker ps

二、Volume

甚麼是 Volume ?

  • Volume 是 Docker 幫我們建的一塊資料空間
  • 存在你的硬碟上(不是容器內部)。
  • 就算你把容器刪掉,Volume 裡的資料還會留著。
  • 用來存資料庫檔案、網站內容、日誌檔案、任何要保存的東西。

為甚麼要用Volume ?

如果不設定 Volume,容器內資料會:
容器重啟、容器刪除 -> 資料遺失消失
這在開發或生產環境都非常致命(想像你的 MySQL 資料庫一重啟就變空白🤣)
所以學會 Volume,是做任何正式 Docker 專案必學技能!

指令 功能
docker volume create <自己取> 建立Volume
docker volume ls 查看目前有哪些Volume
docker run -d -p 8081:80 -v mydata:/usr/share/nginx/html nginx 用Volume 綁定啟動容器

備註:docker run -d -p 8081:80 -v mydata:/usr/share/nginx/html nginx指令拆解

部份 說明
docker run 啟動一個容器
-d 背景執行
-p 8081:80 將本機的8081 port 綁到容器內部的80 port(nginx預設的port)
-v mydata:/usr/share/nginx/html 將 Volume mydata 掛載到容器的 /usr/share/nginx/html 資料夾
nginx 使用 nginx 官方image

https://ithelp.ithome.com.tw/upload/images/20250428/201726681tfe39MB8i.png

以上三個指令完成,成功的話用docker volume inspect mydata可以看到以下畫面:
https://ithelp.ithome.com.tw/upload/images/20250428/20172668Jv4g0Ek5ZB.png

nginx 預設會讀取 /usr/share/nginx/html 作為網站資料夾。
但我們用 Volume 把這個資料夾綁出去 ➔ 變成跟本地 mydata 連在一起。
以後只要修改 Volume 裡的內容,就可以直接改網站,不用重啟容器!

好的,現在我們來看看資料是不是不會消失
首先,我們先進入容器
docker exec -it 容器ID bash
接著,到nginx網頁資料夾
cd /usr/share/nginx/html
再來,建立一個新的index.html
echo "Hello Hi Hi Docker Volume!" > index.html
現在打開瀏覽器輸入 http://localhost:8081 會在頁面上看到 Hello Hi Hi Docker Volume!
Hello Hi Hi Docker Volume!

來實驗看看了!!
首先,刪掉 nginx 容器,但不刪 Volume
Step1:刪除容器
docker stop 容器ID docker rm 容器ID
Step2: 用同樣的Volume 再跑一次nginx
docker run -d -p 8081:80 -v mydata:/usr/share/nginx/html nginx
Step3:再打開http://localhost:8081
會發現網頁還是Hello Hi Hi Docker Volume!
(容器被刪掉了,但是資料還在!!)

整理上面的指令:

指令 功能
docker volume create <自己取> 建立Volume
docker volume ls 查看目前有哪些Volume
docker run -d -p 8081:80 -v mydata:/usr/share/nginx/html nginx 用Volume 綁定啟動容器
docker exec -it 容器ID bash 進入容器
echo "文字" > 檔案 修改內容
docker stop->docker rm 刪除容器但保留Volume

備註:

  1. 除非使用docker volume rm mydata,不然資料會持續存在
  2. 一個 Volume 可以被多個容器共用
    到這邊已經知道 Volume在做什麼了,接下來的挑戰可做可不做!

Volume 進階挑戰(Volume+MySQL)

目標

  1. 用 Docker 啟動一個 MySQL 資料庫容器
  2. 把資料存到 Volume 裡
  3. 試試看:容器刪除後資料還能留著!

Step1: 建立一個Volume
docker volume create mysql_data
Step2: pull MySQL 官方 Image
docker pull mysql:5.7
Step3: 檢查 mysql image有沒有下載下來
docker images
Step4: docker run -d --name judymysql -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 -v mysql_data:/var/lib/mysql mysql:5.7

部份 說明
--name judymysql 自己取容器名稱
-e MYSQL_ROOT_PASSWORD=填入密碼 設定root密碼
-p 3306:3306 把本機 3306 port 連到容器內的 3306(MySQL port)
-v mydata:/usr/share/nginx/html 把 Volume mysql_data 掛載到容器的/var/lib/mysql 資料夾
mysql:5.7 使用的 image

docker run -d --name judymysql -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 -v mysql_data:/var/lib/mysql mysql:5.7 跟 docker ps

備註: 成功後用docker ps可以看到 judymysql 正在運行
備註: 我自己電腦有安裝MySQL所以3306 port已經被佔據,所以最後我將Step4指令改為 -p 3307:3306
Step5:連接到MySQL測試看看
docker exec -it judymysql bash -> 進入容器
mysql -u root -p -> 在容器內,登入MySQL
(輸入密碼)
成功登入會出現mysql>這個畫面,有看到的話,恭喜已經連到MySQL資料庫!
連接到資料庫

Step6: 建立一個測試資料庫
CREATE DATABASE docker_test;
SHOW DATABASES;
你會看到docker_test出現在資料庫清單中
建立並顯示資料庫列表
Step7: 刪除容器,看看資料是否還存在
首先,先離開MySQL 輸入exit
接著,再離開bash 輸入exit
然後,暫停容器,輸入docker stop judymysql
最後,刪除容器,輸入docker rm judymysql -> 如此一來,你的容器就不見了,但Volume mysql_data還在
離開離開再暫停容器並刪除容器
Step8: 重新建立 MySQL 容器(要用同一個Volume)
docker run -d --name judymysqlrecreate -e MYSQL_ROOT_PASSWORD=password -p 3307:3306 -v mysql_data:/var/lib/mysql mysql:5.7
重建一個 MySQL 容器
Step9: 再進入容器登入MySQL
docker exec -it judymysqlrecreate bash
mysql -u root -p -> 接著輸入密碼 -> 輸入SHOW DATABASES -> 看到剛剛建立的docker_test
進入容器登入容器
輸入SHOW DATABASES; -> 就會看到剛剛建立的docker_test還存在
SHOW DATABASES
恭喜!做完這個挑戰不容易,現在已經完全了解Volume

三、建立一個自己的Docker network

甚麼是Docker Network?

Docker Network 就是讓這些容器可以互相看到彼此、互相傳資料的方式
備註: Docker最常用的是 Network 類型 bridge

自己建Network的原因

Docker default 使用 default bridge
容器之間只能用IP位址,IP位置常常變所以不方便
自己建network就有DNS,很方便互相溝通,且容器之間可以互ping

開始建立自己的Network

docker network create mynetwork -> 建一個新的Network,名字叫mynetwork
docker network ls -> 確認network有沒有建立成功
建立mynetwork

建立兩個容器並加入剛剛建的Network

docker run -d --name joinmynet1 --network mynetwork nginx -> 會印出容器ID
docker run -d --name joinmynet2 --network mynetwork nginx -> 會印出容器ID
docker ps -> 會看到joinmynet1、joinmynet2都在運行

創建兩個容器

看看容器有沒有互聯 joinmynet1 ping joinmynet2

docker exec -it joinmynet1 bash -> 進入joinmynet1 容器

安裝 ping 工具

apt update
apt install -y iputils-ping

在joinmynet1 裡面 ping joinmynet2

ping joinmynet2
備註: ping不會停下,要用ctrl+c手動中止
ping

今天內容好像太多了,恭喜完成到這邊的人!明天進入Dockerfile打包盡量簡潔一點哈哈。

[Day1] 上一篇
[Day3] 下一篇


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言